Skip to main content

日志解析规则配置

Last updated on

在全量日志中,您可以通过添加日志库将满足特定条件的日志写入不同日志库中,同时通过配置日志解析规则,将特定格式的日志进行结构化并加快查询速度。本文档将指导如何配置日志解析规则。

1 确定应用日志格式

以Java日志格式为参考:

2024-10-17 12:03:18.971 [http-nio-12346-exec-17] INFO  travel.service.TravelServiceImpl - [getRestTicketNumber][Get Rest tickets num][num is: Response(status=1, msg=Get Left Ticket of Internal Success, data=1073741823)]

2 根据日志格式编写解析规则

在APO日志解析规则配置中,正则表达式的捕获组名会被提取出为日志字段列。下面给出匹配上述日志格式的解析规则示例:

.msg, err = parse_regex(.content, r'(?P<ts>.*?) \[(?P<thread>.*?)\] (?P<level>.*?)  (?P<method>.*?) - (?P<msg>.*)')
if err == null {
.content = encode_json(.msg)
}
del(.msg)

其中,parse_regex部分为正则表达式:

(?P<ts>.*?) \[(?P<thread>.*?)\] (?P<level>.*?)  (?P<method>.*?) - (?P<msg>.*)

上述正则表达式通过命名捕获组语法将日志内容转换为 ts thread level method msg 等结构化标签。命名捕获组的标签名会在展示在“日志字段”中,对应 ClickHouse 日志库中的单独列,用于加快查询速度。

注意:tsmsg 是两个特殊的标签,不会处理为列,请仅将"日志时间"和"日志消息"命名为 tsmsg

如何根据需求修改表达式

假设需要提取出示例日志内容中 - 符号后面的 [getRestTicketNumber] 作为调用方法标签,可以在正则中添加\[?(P<caller>).*?\],结果如下:

(?P<ts>.*?) \[(?P<thread>.*?)\] (?P<level>.*?)  (?P<method>.*?) - \[?(P<caller>).*?\](?P<msg>.*)

完成配置规则后,捕获组格式\[?(P<caller>).*?\]会提取出日志字段列 caller,加快过滤查询速度。最终日志中就会出现结构化标签"caller":"getRestTicketNumber"

扩展说明:捕获组表达式

在正则表达式中,(?P<name>...) 是一种用于"命名捕获组"的语法。括号中的 name 是捕获组的名称,这样可以通过名称而不是位置来引用捕获的内容。APO 使用命名捕获组作为日志解析规则的一部分。

3 检验规则是否正确

请在 VRL Playgroud 中输入日志解析规则,然后按照图示中流程对规则正确性进行验证。

logs-vrl

4 检验成功后添加进APO规则解析

logs-parse-rule